{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Demo 1: Linear Regression\n", "\n", "In this demo we will show:\n", "* Linear regression using the closed form solution and gradient descent. \n", "* Adaptive Learning rates.\n", "* Gradient descent to minimize other (non-convex) functions. \n", "* Linear regression on polynomials.\n", "* A real life example on Diabetes" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The autoreload extension is already loaded. To reload it, use:\n", " %reload_ext autoreload\n" ] } ], "source": [ "# Code source: Sebastian Curi and Andreas Krause, based on Jaques Grobler (sklearn demos).\n", "# License: BSD 3 clause\n", "\n", "# We start importing some modules and running some magic commands\n", "% matplotlib inline\n", "% reload_ext autoreload\n", "% load_ext autoreload\n", "% autoreload 2\n", "\n", "# General math and plotting modules.\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# Project files.\n", "from util import gradient_descent, generate_polynomial_data\n", "import plot_helpers\n", "from regressors import LinearRegressor\n", "from regularizers import Regularizer, L2Regularizer\n", "\n", "# Widget and formatting modules\n", "import ipywidgets\n", "from ipywidgets import interact, interactive, interact_manual\n", "import pylab\n", "# If in your browser the figures are not nicely vizualized, change the following line. \n", "pylab.rcParams['figure.figsize'] = (10, 5)\n", "\n", "# Machine Learning library. \n", "\n", "import sklearn\n", "from sklearn import datasets, linear_model\n", "from sklearn.datasets import make_regression\n", "from sklearn.linear_model import Ridge\n", "from sklearn.preprocessing import scale, PolynomialFeatures\n", "from sklearn.pipeline import make_pipeline\n", "from sklearn.metrics import mean_squared_error, r2_score\n", "\n", "import warnings\n", "warnings.filterwarnings('ignore')\n", "# from sklearn import datasets, linear_model\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear regression \n", "\n", "We will start by fitting by linear regression a set of data points of the type $D = \\left\\{(x, y)_i\\right\\}$, $i = 1, 2, \\ldots, n$.\n", "\n", "The objective of linear regression, is to find coefficents $\\hat{w}$ such that the residual between $\\hat{y} = \\hat{w}^\\top \\tilde{x}$, and $y$ is small. (Remember that $\\tilde{x} = [x, 1]$). From now on, $x$ will be considered the extended version unless stated otherwise, hence dropping the tilde notation. \n", "\n", "The goodness of fit in Linear regression is usually calculated as the sum of squared residuals, but other loss functions are also available. \n", "\n", "The risk function is defined as: $$ R(\\hat{w}) = \\mathbb{E}[\\frac{1}{2}(y-\\hat{w}^\\top x)^2)]$$\n", "where the expectation is taken over the data generating the distribution of points. As the whole data generating distribution is not known, the expectation is approximated by samples from the **training** set. \n", "\n", "The risk is approximated by the empirical risk as:\n", "$$ R(\\hat{w}) \\approx \\hat{R}(\\hat{w}) \\frac{1}{n} \\sum_{i=1}^n (y_i - \\hat{w}^\\top x_i)^2.$$ \n", "\n", "\n", "By grouping the data into the feature matrix $X$ and target matrix $Y$, such that:\n", "\n", "$$ X = \\left[ \\begin{array}{cc} x_1^\\top & 1\\\\ x_2^\\top & 1 \\\\ \\vdots & \\vdots \\\\ x_n^\\top & 1 \\end{array}\\right]$$\n", "$$ Y = \\left[ \\begin{array}{c} y_1\\\\ y_2 \\\\ \\vdots \\\\ y_n \\end{array}\\right].$$ \n", "\n", "The empirical risk function can be expressed as:\n", "$$\\hat{R}(\\hat{w})= \\frac{1}{n}(X\\hat{w} - Y)^\\top (X\\hat{w} - Y) $$\n", "\n", "\n", "### Closed form solution\n", "\n", "The closed form solution to the regression problem is given by:\n", "$$\\hat{w} = (X^\\top X)^{-1} X^T y.$$ \n", "\n", "The closed form can be computed with a total number of operations given by $\\approx O(d^3+nd^2)$ .\n", "\n", "### Gradient Descent\n", "\n", "When the number of dimensions or examples grows, the closed form solution becomes expensive to compute. However, the parameters $\\hat{w}$ can be updated via a gradient descent rule: \n", "\n", "$$ \\hat{w}_{t+1} \\gets \\hat{w}_t - \\eta_t \\left.\\frac{\\partial \\hat{R} }{\\partial \\hat{w}} \\right|_{w=w_t},$$\n", "\n", "where $\\eta_t$ is a parameter of the algorithm, $k$ is the iteration index, and $\\frac{\\partial \\hat{R}}{\\partial \\hat{w}}$\n", "\n", "The gradients of $\\hat{R}$ with respect to the parameters are:\n", "\n", "$$ \\frac{\\partial \\hat{R} }{\\partial \\hat{w}} = \\frac{1}{} X^\\top(Xw - y) $$ \n", "In the *vanilla* gradient descent method, $\\eta(k)=\\eta_0$ is a constant. However other algorithms exists that modify this. We will discuss these later. \n", "\n", "The computational complexity of Gradient descent is $O(n_{\\text{iter}} \\cdot n d)$. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAmUAAAFNCAYAAABBmBjhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3X+UnHWV5/HPTUIXgWCCJkCGX1EG\nWRTIRFsY4mroqDNZBTGrs0d3+RGc3UzI4tFdd/2xDiPrzHhmRncdlJ5AdoyZ08MOOIIYdKcdMCZR\nMcEOcRQIoDg6RIRufqQlENJg7v7xrbIrlfr1VD1Vz/eper/O6VPdVU89fYs+4uXe7/d+zd0FAACA\nbM3IOgAAAACQlAEAAESBpAwAACACJGUAAAARICkDAACIAEkZAABABEjKAKANZrbKzL6ddRwA8o+k\nDEDqzOzdZrbDzJ41s/Hi92vNzLKOrZKZbTGz/9ihey8yMzezfcWvx83sq2b2lgT3IOkD+gRJGYBU\nmdkHJV0r6VOSTpB0vKQ1kl4vaaDLsczq5u+rY567z5G0WNIdkr5sZquyDQlAbEjKAKTGzOZK+oSk\nte7+JXd/xoNd7v4f3P1A8bqCmX3azP6lWD263sxmF1+7wMz2mNkHi1W2X5jZFWW/o5n3ftjMHpP0\nBTM7tlidmjCzp4vfn1S8/k8lvUHSdcVK1nXF5/+Vmd1hZk+Z2YNm9u/Kfv/LzGyTmf3SzO6WdFqz\n/3zc/TF3v1bSNZL+3MxmFO/5ETN72MyeMbP7zWxl8fkzJV0v6fxifHuLz7/NzHYVY3jEzK5p5e8F\nIC4kZQDSdL6kgqSvNLjuzyW9UtJvSfpNSSdK+qOy10+QNLf4/O9LGjazYxO896WSTpW0WuHfc18o\n/nyKpP2SrpMkd/+YpG9Jusrd57j7VWZ2tEI16/9KOk7SeyT9lZm9unj/YUnPS1oo6b3Fr6RuLd77\njOLPDyskh3Ml/U9Jf2tmC919t0KV8bvF+OYVr39W0mWS5kl6m6QrzewdLcQBICIkZQDSNF/SE+7+\nYukJM7vLzPaa2X4ze2NxXdl/kvRf3P0pd39G0iclvbvsPi9I+oS7v+Du/0/SPklnNPneg5I+7u4H\n3H2/uz/p7re4+3PF6/9U0rI6n+FCST919y+4+4vufo+kWyS9y8xmSnqnpD9y92fd/V5Jf9PCP6dH\n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\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Generate the data.\n", "\n", "num_points = 100 # Number of training points.\n", "noise = 0.6 # Noise Level (needed for data generation).\n", "\n", "a_true = 3 # Slope.\n", "b_true = 1 # Intercept. \n", "w_true = np.array([a_true, b_true])\n", "\n", "X, Y = generate_polynomial_data(num_points, noise, w_true)\n", "\n", "# Plot Data\n", "fig = plt.subplot(111);\n", "plot_opts = {'x_label': '$x$', 'y_label': '$y$', 'title': 'Generated Data', 'y_lim': [np.min(Y)-0.5, np.max(Y)+0.5]}\n", "plot_helpers.plot_data(X[:, 0], Y, fig=fig, options=plot_opts)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Closed Form Solution:\n", "\n", "The closed form solution to the regression problem is given by:\n", "$$\\hat{w} = (X^\\top X + \\lambda I_d)^{-1} X^T y.$$ \n", "\n", "Because there are only 2 parameters, the inverse of $(X^\\top X + \\lambda I_d)$ is fast to do $\\approx O(d^3)$. Hence, the closed form can be computed with a total number of operations given by $\\approx O(d^3+nd^2)$ ." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f599d555c6c745109b4cbbc8edca4321", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(FloatSlider(value=-3.0, continuous_update=False, description='Regularization 10^:', max=3.0, min=-3.0, readout_format='.1f', step=0.5, style=SliderStyle(description_width='initial')), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def change_reg_coefficient(reg):\n", " dim = X.shape[1]\n", " w_hat_closed_form = np.dot(np.linalg.pinv(np.dot(X.T, X) + np.power(10., reg) * np.eye(dim)), np.dot(X.T, Y))\n", " print(\"w_hat = {}\".format(w_hat_closed_form))\n", " # Plot closed form solution\n", " fig = plt.subplot(111)\n", " plot_opts = {'x_label': '$x$', 'y_label': '$y$', 'title': 'Closed Form Solution', 'legend': True,\n", " 'y_lim': [np.min(Y)-0.5, np.max(Y)+0.5]}\n", "\n", " plot_helpers.plot_data(X[:, 0], Y, fig=fig, options=plot_opts)\n", " plot_helpers.plot_fit(X, w_hat_closed_form, fig=fig, options=plot_opts)\n", "\n", "interact(change_reg_coefficient,\n", " reg=ipywidgets.FloatSlider(value=-3,\n", " min=-3,\n", " max=3,\n", " step=0.5,\n", " readout_format='.1f',\n", " description='Regularization 10^:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False));\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "523bb39f86f34c51b8a13eab50d08ea3", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(FloatSlider(value=0.1, continuous_update=False, description='Learning rate:', max=2.0, min=0.1, readout_format='.1f', style=SliderStyle(description_width='initial')), IntSlider(value=10, continuous_update=False, description='Number of iterations:', max=20, min=5, style=SliderStyle(description_width='initial')), FloatSlider(value=-3.0, continuous_update=False, description='Regularization 10^:', max=1.0, min=-3.0, step=0.5, style=SliderStyle(description_width='initial')), Button(description='Run Interact', style=ButtonStyle()), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Gradient Descent solution. \n", "\n", "def change_learning_params(eta0, n_iter, reg=0):\n", " regressor = LinearRegressor(X, Y)\n", " regularizer = L2Regularizer(np.power(10., reg))\n", " w0 = np.array([0., 0.])\n", " opts = {'eta0': eta0, 'n_iter': n_iter, 'n_samples': X.shape[0]}\n", " trajectory, indexes = gradient_descent(w0, regressor, regularizer, opts)\n", "\n", " contourplot = plt.subplot(121)\n", " dataplot = plt.subplot(122)\n", " contour_opts = {'x_label': '$w_0$', 'y_label': '$w_1$', 'title': 'Weight trajectory', 'legend': False,\n", " }\n", " data_opts = {'x_label': '$x$', 'y_label': '$y$', 'title': 'Regression trajectory', 'legend': False, \n", " 'y_lim': [np.min(Y)-0.5, np.max(Y)+0.5]}\n", " plot_opts = {'contour_opts': contour_opts, 'data_opts': data_opts}\n", "\n", " plot_helpers.linear_regression_progression(X, Y, trajectory, indexes, regressor.test_loss,\n", " contourplot, dataplot, options=plot_opts)\n", "\n", "interact_manual(change_learning_params,\n", " eta0=ipywidgets.FloatSlider(value=1e-1,\n", " min=1e-1,\n", " max=2,\n", " step=1 * 1e-1,\n", " readout_format='.1f',\n", " description='Learning rate:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " n_iter=ipywidgets.IntSlider(value=10,\n", " min=5,\n", " max=20,\n", " step=1,\n", " description='Number of iterations:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " reg=ipywidgets.FloatSlider(value=-3,\n", " min=-3,\n", " max=1,\n", " step=0.5,\n", " readout_format='.2f',\n", " description='Regularization 10^:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " );\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Adaptive Learning rates. \n", "\n", "* Annealing \n", " $\\eta_{t} = \\frac{\\eta_0}{(1+t)^{0.6}}$\n", "\n", "* Bold driver heuristic:\n", "\n", " If $\\hat{R}(\\hat{w}_t) > \\hat{R}(\\hat{w}_{t+1})$, \n", " \n", " $\\eta_{t+1} = \\eta_{t}/5$\n", " \n", " else\n", " \n", " $\\eta_{t+1} \\gets \\eta_{t}*1.1$\n", "\n", " \n", "* AdaGrad:\n", " $\\eta_t = \\frac{\\eta_0}{\\sqrt{\\sum_{j=0}^t g_j^2}}$, where $g_j$ is the 2-norm gradient of $L$ at time $j$. \n", "\n", " \n", " " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "e392dcf182954ba8abc7e13333061160", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(RadioButtons(description='Learning rate heuristics:', options=('Bold driver', 'AdaGrad', 'Annealing', 'None'), style=DescriptionStyle(description_width='initial'), value='Bold driver'), Button(description='Run Interact', style=ButtonStyle()), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def change_heuristics(learning_rate_scheduling=None):\n", " regressor = LinearRegressor(X, Y)\n", " regularizer = L2Regularizer(0)\n", " w0 = np.array([0., 0.])\n", " if learning_rate_scheduling == 'None':\n", " learning_rate_scheduling = None\n", "\n", " opts = {'eta0': 2,\n", " 'n_iter': 10,\n", " 'n_samples': X.shape[0],\n", " 'algorithm': 'GD',\n", " 'learning_rate_scheduling': learning_rate_scheduling\n", " }\n", " trajectory, indexes = gradient_descent(w0, regressor, regularizer, opts)\n", "\n", " contourplot = plt.subplot(121)\n", " dataplot = plt.subplot(122)\n", " contour_opts = {'x_label': '$w_0$', 'y_label': '$w_1$', 'title': 'Weight trajectory', 'legend': False}\n", " data_opts = {'x_label': '$x$', 'y_label': '$y$', 'title': 'Regression trajectory', 'legend': False,\n", " 'y_lim': [np.min(Y)-0.5, np.max(Y)+0.5]}\n", " plot_opts = {'contour_opts': contour_opts, 'data_opts': data_opts}\n", "\n", " plot_helpers.linear_regression_progression(X, Y, trajectory, indexes, regressor.test_loss,\n", " contourplot, dataplot, options=plot_opts)\n", "\n", "interact_manual(change_heuristics,\n", " learning_rate_scheduling=ipywidgets.RadioButtons(\n", " options=['Bold driver', 'AdaGrad', 'Annealing', 'None'],\n", " value='Bold driver',\n", " description='Learning rate heuristics:',\n", " style={'description_width': 'initial'})\n", " );" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Gradient descent to minimize other (non-convex) functions.\n", "\n", "Gradient descent works can be used as a minimizing algorithm for other functions, even if they are non-convex. Gradient descent, if it converges, converges to a local minimum. Lets look at the function $$f(w) = \\sin(w_0)\\cos(w_1).$$ We would like to find parameters $(a,b)$ that minimize the function $f$. \n", "\n", "The gradients are:\n", "$$\\frac{\\partial f}{\\partial w_0} = \\cos(w_0)\\cos(w_1),$$\n", "$$\\frac{\\partial f}{\\partial w_1} = -\\sin(w_0)\\sin(w_1).$$" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "b84868ab0c884689b79b9649a88a767f", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(FloatSlider(value=4.0, continuous_update=False, description='Learning rate:', max=10.0, min=0.1, readout_format='.1f', style=SliderStyle(description_width='initial')), IntSlider(value=10, continuous_update=False, description='Number of iterations:', max=50, min=5, style=SliderStyle(description_width='initial')), RadioButtons(description='Learning rate heuristics:', index=3, options=('Bold driver', 'AdaGrad', 'Annealing', 'None'), style=DescriptionStyle(description_width='initial'), value='None'), FloatSlider(value=-0.9, continuous_update=False, description='w_0:', max=3.0, min=-3.0, readout_format='.1f', style=SliderStyle(description_width='initial')), FloatSlider(value=1.1, continuous_update=False, description='w_1:', max=3.0, min=-3.0, readout_format='.1f', style=SliderStyle(description_width='initial')), Button(description='Run Interact', style=ButtonStyle()), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "class sincos(object):\n", " def __init__(self):\n", " pass\n", "\n", " def get_number_samples(self):\n", " return 0\n", "\n", " def loss(self, w, *args):\n", " return np.sin(w[0]) * np.cos(w[1])\n", "\n", " def gradient(self, w, *args):\n", " return np.array([np.cos(w[0]) * np.cos(w[1]), -np.sin(w[0]) * np.sin(w[1])])\n", "\n", "def optimize_sincos(eta, n_iter, learning_rate_scheduling, a0, b0):\n", " regressor = sincos()\n", " regularizer = L2Regularizer(0)\n", " w0 = np.array([a0, b0])\n", " if learning_rate_scheduling == 'None':\n", " learning_rate_scheduling = None\n", "\n", " opts = {'eta0': eta,\n", " 'n_iter': n_iter,\n", " 'n_samples': 0,\n", " 'algorithm': 'GD',\n", " 'learning_rate_scheduling': learning_rate_scheduling\n", " }\n", " trajectory, indexes = gradient_descent(w0, regressor, regularizer, opts)\n", "\n", " contourplot = plt.subplot(111)\n", " dataplot = None\n", " contour_opts = {'x_label': '$w_0$', 'y_label': '$w_1$', 'title': 'Weight trajectory', 'legend': False}\n", " plot_opts = {'contour_opts': contour_opts}\n", "\n", " plot_helpers.linear_regression_progression(np.array([]), np.array([]), trajectory, indexes, regressor.loss,\n", " contourplot, dataplot, options=plot_opts)\n", "\n", "\n", "interact_manual(optimize_sincos,\n", " eta=ipywidgets.FloatSlider(value=4,\n", " min=1e-1,\n", " max=10,\n", " step=1e-1,\n", " readout_format='.1f',\n", " description='Learning rate:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " n_iter=ipywidgets.IntSlider(value=10,\n", " min=5,\n", " max=50,\n", " step=1,\n", " description='Number of iterations:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " learning_rate_scheduling=ipywidgets.RadioButtons(\n", " options=['Bold driver', 'AdaGrad', 'Annealing', 'None'],\n", " value='None',\n", " description='Learning rate heuristics:',\n", " style={'description_width': 'initial'}),\n", " a0=ipywidgets.FloatSlider(value=-0.9,\n", " min=-3,\n", " max=3,\n", " step=.1,\n", " readout_format='.1f',\n", " description='w_0:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " b0=ipywidgets.FloatSlider(value=1.1,\n", " min=-3,\n", " max=3,\n", " step=.1,\n", " readout_format='.1f',\n", " description='w_1:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Linear regression on polynomials.\n", "\n", "Higher order features can be constructed from data $D = \\left\\{(x, y)_i\\right\\}$, $i = 1, 2, \\ldots, n$. For example cubic polynomial features can be created by forming the data and target matrices as:\n", "\n", "$$ X = \\left[ \\begin{array}{cccc} x_1^3 & x_1^2 & x_1 & 1\\\\ x_2^3 & x_2^2 & x_2 & 1 \\\\ \\vdots & \\vdots \\\\ x_n^3 & x_n^2 & x_n & 1 \\end{array}\\right]$$\n", "$$ Y = \\left[ \\begin{array}{c} y_1\\\\ y_2 \\\\ \\vdots \\\\ y_n \\end{array}\\right].$$ \n", "\n", "The predictor is again of the form $\\hat{Y} = X\\hat{w}$. Even if the features in the data matrix $X$ are non-linear on the data, the estimator is linear on the parameters $\\hat{w}$. Hence, the empirical risk function is again:\n", "$$\\hat{R}(\\hat{w})= \\frac{1}{n}(X\\hat{w} - Y)^\\top (X\\hat{w} - Y),$$\n", "\n", "and linear regression problem is identical as in the previous example." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "134f8a0a1de14996ac5d2a57139fb816", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(FloatSlider(value=-3.0, continuous_update=False, description='Regularization 10^:', max=3.0, min=-3.0, readout_format='.1f', step=0.5, style=SliderStyle(description_width='initial')), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Generate the data and calculate the close form solution\n", "\n", "num_points = 100 # Number of training points.\n", "noise = 0.3 # Noise Level (needed for data generation).\n", "\n", "w_true = np.array([-.5, .5, 1, -1])\n", "X, Y = generate_polynomial_data(num_points, noise, w_true)\n", "\n", "def change_reg_coefficient(reg):\n", " dim = X.shape[1]\n", " w_hat_closed_form = np.dot(np.linalg.pinv(np.dot(X.T, X) + np.power(10., reg) * np.eye(dim)), np.dot(X.T, Y))\n", " # \n", "\n", " # Plot closed form solution\n", " fig = plt.subplot(111)\n", " plot_opts = {'x_label': '$x$', 'y_label': '$y$', 'title': 'Closed Form Solution', 'legend': True, \n", " 'y_lim': [np.min(Y)-0.5, np.max(Y)+0.5]}\n", " plot_helpers.plot_data(X[:, -2], Y, fig=fig, options=plot_opts)\n", " plot_helpers.plot_fit(X, w_hat_closed_form, fig=fig, options=plot_opts)\n", " \n", " print(\"w_hat = {}\".format(w_hat_closed_form))\n", "\n", "interact(change_reg_coefficient,\n", " reg=ipywidgets.FloatSlider(value=-3,\n", " min=-3,\n", " max=3,\n", " step=0.5,\n", " readout_format='.1f',\n", " description='Regularization 10^:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False));\n" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "062b8817725e43e3a89481ee300f3d94", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(FloatSlider(value=0.01, continuous_update=False, description='Learning rate:', max=1.0, min=0.001, readout_format='.3f', step=0.001, style=SliderStyle(description_width='initial')), IntSlider(value=10, continuous_update=False, description='Number of iterations:', max=50, min=5, style=SliderStyle(description_width='initial')), FloatSlider(value=-3.0, continuous_update=False, description='Regularization 10^:', max=3.0, min=-3.0, readout_format='.1f', step=0.5, style=SliderStyle(description_width='initial')), RadioButtons(description='Learning rate heuristics:', index=3, options=('Bold driver', 'AdaGrad', 'Annealing', 'None'), style=DescriptionStyle(description_width='initial'), value='None'), Button(description='Run Interact', style=ButtonStyle()), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def optimize_cubic(eta, n_iter, reg, learning_rate_scheduling):\n", " regressor = LinearRegressor(X, Y)\n", " regularizer = L2Regularizer(np.power(10., reg))\n", " w0 = np.array([0., 0., 0., 0.])\n", " if learning_rate_scheduling == 'None':\n", " learning_rate_scheduling = None\n", "\n", " opts = {'eta0': eta,\n", " 'n_iter': n_iter,\n", " 'n_samples': X.shape[0],\n", " 'algorithm': 'GD',\n", " 'learning_rate_scheduling': learning_rate_scheduling\n", " }\n", " trajectory, indexes = gradient_descent(w0, regressor, regularizer, opts)\n", "\n", " contourplot = None\n", " dataplot = plt.subplot(111)\n", " data_opts = {'x_label': '$x$', 'y_label': '$y$', 'title': 'Regression trajectory', 'legend': False,\n", " 'y_lim': [np.min(Y)-0.5, np.max(Y)+0.5]}\n", " plot_opts = {'data_opts': data_opts}\n", "\n", " plot_helpers.linear_regression_progression(X, Y, trajectory, indexes, regressor.test_loss,\n", " contourplot, dataplot, options=plot_opts)\n", "\n", "\n", "interact_manual(optimize_cubic,\n", " eta=ipywidgets.FloatSlider(value=1e-2,\n", " min=1e-3,\n", " max=1,\n", " step=1e-3,\n", " readout_format='.3f',\n", " description='Learning rate:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " n_iter=ipywidgets.IntSlider(value=10,\n", " min=5,\n", " max=50,\n", " step=1,\n", " description='Number of iterations:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " reg=ipywidgets.FloatSlider(value=-3,\n", " min=-3,\n", " max=3,\n", " step=0.5,\n", " readout_format='.1f',\n", " description='Regularization 10^:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " learning_rate_scheduling=ipywidgets.RadioButtons(\n", " options=['Bold driver', 'AdaGrad', 'Annealing', 'None'],\n", " value='None',\n", " description='Learning rate heuristics:',\n", " style={'description_width': 'initial'})\n", " );" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Choosing the Polynomial Order.\n", "\n", "If the order of the polynomial is not known, then how should we select it? **Answer**: Cross-validation!" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "f28200f16a4148d88b9632b56ebed58c", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(FloatSlider(value=1.0, continuous_update=False, description='Noise level:', max=3.0, readout_format='.1f', step=0.5, style=SliderStyle(description_width='initial')), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def f(x):\n", " return x * np.sin(x) \n", "\n", "x_plot = np.linspace(-1, 11, 100)\n", "f_plot = f(x_plot)\n", "X_plot = x_plot[:, np.newaxis]\n", "\n", "def resample(noise):\n", " N = 20\n", " folds = 5\n", " n = int(N/folds)\n", "\n", " xraw = np.linspace(0, 10, N)\n", " # rng = np.random.RandomState(0)\n", " np.random.shuffle(xraw)\n", "\n", " #noise=1\n", "\n", " x = dict()\n", " y = dict()\n", " for i in range(folds):\n", " x[i] = xraw[n*i:n*(i+1)]\n", " y[i] = f(x[i]) + np.random.normal(size=(n,)) * noise\n", "\n", " \n", " def change_degree(degree, reg, fold):\n", " X = np.array(())\n", " Y = np.array(())\n", " for i in range(5):\n", " if i == (fold-1):\n", " Xval = x[i]\n", " Yval = y[i]\n", " else:\n", " X = np.concatenate((X, x[i]))\n", " Y = np.concatenate((Y, y[i]))\n", "\n", "\n", " X = X[:, np.newaxis]\n", " Xval = Xval[:, np.newaxis]\n", "\n", " model = make_pipeline(PolynomialFeatures(degree), Ridge(alpha=np.power(10., reg)))\n", "\n", " model.fit(X, Y)\n", " \n", " fig = plt.subplot(111)\n", " lw = 2\n", " plt.plot(x_plot, f_plot, color='cornflowerblue', linewidth=lw, label=\"Ground Truth\")\n", " y_plot = model.predict(X_plot)\n", " plt.plot(x_plot, y_plot, color='r', linewidth=lw, label=\"Degree %d\" % degree)\n", " \n", " opts = {'marker': 'b*', 'label': 'Training Points'}\n", " plot_helpers.plot_data(X, Y, fig=fig, options=opts)\n", " \n", " plot_opts = {'x_label': '$x$', 'y_label': '$y$', 'y_lim': [np.min(f_plot)-3, np.max(f_plot)+3], \n", " 'legend':True, 'legend_loc': 'lower left'}\n", " opts = {'marker': 'mX', 'label': 'Validation Points'}\n", " plot_opts.update(opts)\n", " plot_helpers.plot_data(Xval, Yval, fig=fig, options=plot_opts)\n", " \n", " print(\"Train. Error: {:.2f}\".format(1/X.size * np.linalg.norm(model.predict(X) - Y, 2)))\n", " print(\"Valid. Error: {:.2f}\".format(1/Xval.size * np.linalg.norm(model.predict(Xval) - Yval, 2)))\n", " \n", " \n", " interact(change_degree,\n", " degree=ipywidgets.IntSlider(value=1,\n", " min=1,\n", " max=15,\n", " step=1,\n", " description='Polynomial Degree:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " reg=ipywidgets.FloatSlider(value=-3,\n", " min=-3,\n", " max=3,\n", " step=0.5,\n", " readout_format='.1f',\n", " description='Regularization 10^:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),\n", " fold=ipywidgets.ToggleButtons(value=1,\n", " options=[1, 2, 3, 4, 5],\n", " description='Validation fold:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),);\n", "\n", "interact(resample, noise=ipywidgets.FloatSlider(value=1,\n", " min=0,\n", " max=3,\n", " step=0.5,\n", " readout_format='.1f',\n", " description='Noise level:',\n", " style={'description_width': 'initial'},\n", " continuous_update=False),);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Real data sets: Diabetes prediction\n", "\n", "In this example we will use a diabetes dataset from sklearn. First we will split into train and test data to evaluate the prediction performance. Then a linear regressor using only one feature will be evaluated. In the second cell, a linear regressor using all the features but with no feature transformation is implemented. Finally, a 5th order polynomial transformation on the single feature used in the first cell is evaluated." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# Load the diabetes dataset\n", "diabetes = datasets.load_diabetes()\n", "\n", "Y_all = diabetes.target\n", "X_all = scale(diabetes.data) # zero mean unit variance\n", "n_all = Y_all.size\n", "n_test = 20\n", "\n", "# Split the data into training/testing sets\n", "X_train = X_all[:-n_test]\n", "X_test = X_all[-n_test:]\n", "\n", "# Split the targets into training/testing sets\n", "Y_train = Y_all[:-n_test]\n", "Y_test = Y_all[-n_test:]" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficients: \n", " [ 33.73295272]\n", "Mean squared error: 4058.41\n", "Explained variance: 0.16\n" ] }, { "data": { "image/png": "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\nQgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Now let's train a 1D linear regression based on a single feature\n", "\n", "use_feature = 3\n", "# Use only one feature\n", "\n", "X_train_1D = X_train[:, np.newaxis, use_feature]\n", "X_test_1D = X_test[:, np.newaxis, use_feature]\n", "\n", "# Create linear regression object\n", "regr = linear_model.LinearRegression()\n", "\n", "# Train the model using the training set\n", "regr.fit(X_train_1D, Y_train)\n", "\n", "# Make predictions on the testing set\n", "Y_pred = regr.predict(X_test_1D)\n", "\n", "# The coefficients\n", "print('Coefficients: \\n', regr.coef_)\n", "# The mean squared error\n", "print(\"Mean squared error: %.2f\"\n", " % mean_squared_error(Y_test, Y_pred))\n", "# Explained variance score: 1 is perfect prediction\n", "print('Explained variance: %.2f' % r2_score(Y_test, Y_pred))\n", "\n", "# Plot outputs\n", "plt.scatter(X_test_1D, Y_test, color='black')\n", "plt.plot(X_test_1D, Y_pred, color='blue', linewidth=3)\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficients: \n", " [ 1.44360014e-02 -1.13033495e+01 2.42834645e+01 1.55888584e+01\n", " -3.87242964e+01 2.34407995e+01 4.89200200e+00 8.78083524e+00\n", " 3.53656217e+01 3.61947824e+00]\n", "Mean squared error: 2004.57\n", "Explained variance: 0.59\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Now let's use all features\n", "\n", "# Create linear regression object\n", "regr = linear_model.LinearRegression()\n", "\n", "# Train the model using the training sets\n", "regr.fit(X_train, Y_train)\n", "\n", "# Make predictions using the testing set\n", "Y_pred = regr.predict(X_test)\n", "\n", "# The coefficients\n", "print('Coefficients: \\n', regr.coef_)\n", "# The mean squared error\n", "print(\"Mean squared error: %.2f\"\n", " % mean_squared_error(Y_test, Y_pred))\n", "# Explained variance score: 1 is perfect prediction\n", "print('Explained variance: %.2f' % r2_score(Y_test, Y_pred))\n", "\n", "# Plot outputs\n", "plt.scatter(X_test_1D, Y_test, color='black')\n", "plt.scatter(X_test_1D, Y_pred, color='blue', marker='*')\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coefficients: \n", " [ 0. 32.39842197 13.12177699 -0.36124814 -2.5108258\n", " 0.25200116]\n", "Mean squared error: 3799.76\n", "Explained variance: 0.21\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Now let's use all features\n", "\n", "# Create linear regression object\n", "regr = linear_model.LinearRegression()\n", "\n", "PF = PolynomialFeatures(degree=5, interaction_only=False, include_bias=True)\n", "\n", "X_train_poly = PF.fit_transform(X_train_1D)\n", "X_test_poly = PF.fit_transform(X_test_1D)\n", "\n", "\n", "# Train the model using the training sets\n", "regr.fit(X_train_poly, Y_train)\n", "\n", "# Make predictions using the testing set\n", "Y_pred = regr.predict(X_test_poly)\n", "\n", "# The coefficients\n", "print('Coefficients: \\n', regr.coef_)\n", "# The mean squared error\n", "print(\"Mean squared error: %.2f\"\n", " % mean_squared_error(Y_test, Y_pred))\n", "# Explained variance score: 1 is perfect prediction\n", "print('Explained variance: %.2f' % r2_score(Y_test, Y_pred))\n", "\n", "# Plot outputs\n", "plt.scatter(X_test_1D, Y_test, color='black')\n", "plt.scatter(X_test_1D, Y_pred, color='blue', marker='*')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "# Regularization Paths\n", "\n", "As discussed in classed, the rgularizer can be of different types. Ridge regression has an $l$-2 cost on the weights, while Lasso regression an $l$-1 cost. To analyze the difference between them, we will show how the regression coefficients change as the regularization parameter $\\lambda$ increases. " ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "X, y, w = make_regression(n_samples=10, n_features=10, coef=True, random_state=1, bias=3.5)\n", "from sklearn.linear_model import Lasso \n", "clfs = dict(ridge=Ridge(), lasso=Lasso())\n", "\n", "alphas = np.logspace(-6, 6, 200)\n", "coefs = dict(ridge=[], lasso=[])\n", "for a in alphas:\n", " for name, clf in clfs.items():\n", " clf.set_params(alpha=a, max_iter=10000)\n", " clf.fit(X, y)\n", " coefs[name].append(clf.coef_)\n", "\n", "fig = plt.figure(1)\n", "plt.plot(alphas, coefs['ridge'])\n", "plt.xscale('log')\n", "plt.xlabel('Lambda')\n", "plt.ylabel('weights')\n", "plt.title('Ridge coefficients as a function of the regularization');\n", "\n", "fig = plt.figure(2)\n", "plt.plot(alphas, coefs['lasso'])\n", "plt.xscale('log')\n", "plt.xlabel('Lambda')\n", "plt.ylabel('weights')\n", "plt.title('Lasso coefficients as a function of the regularization');" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 }